package main

import (
	"fmt"
	"strings"
	"unicode/utf8"
)

func main() {
	//定义字符串类型
	s1 := "hello world"
	println(s1)

	//``可以定义原始字符串类型,支持换行,会按照原始格式打印
	s2 := `床前明月光
疑似地上霜
	举头望明月
			低头思故乡
`
	println(s2)

	s3 := "hello world你好"
	//len:获取字符串长度,及字符串包含的byte数量,也即字符串包含的ASCII字符的数量
	println("len of s1 is", len(s1)) //11
	println("len of s3 is", len(s3)) //17

	//获取字符串中的字符数量,与具体编码相关,大多数情况下采用UTF-8编码,一个中文字符可能占用3个ASCII码
	println("rune count in s1 is", utf8.RuneCountInString(s1)) //11
	println("rune count in s3 is", utf8.RuneCountInString(s3)) //13

	//strings包提供了大量字符串的操作
	r := '好'
	contains := strings.ContainsRune(s3, r)
	println(contains)

	byteAndString()
}

// byte及字节,本质上就是uint8,也可以代表一个ASCII字符
// []byte可以和string进行互相转换
func byteAndString() {
	//byte及字节,本质上就是uint8,也可以代表一个ASCII字符
	var a byte = 'a'
	fmt.Printf("%c,%d\n", a, a) //a按照字符打印是'a',按照数值打印是'a'的ASCII编码,即97

	//[]byte可以和string进行互相转换
	//注意:这个转换会涉及到内存拷贝,针对长字符串操作时需要格外小心
	s := "hello world"
	bs := []byte(s)
	for _, b := range bs {
		print(b, " ")
	}
	println()

	s1 := string(bs) //类型转换时,只要编译器不报错,就是可以转
	println(s1)
}
